package carte.element;

import java.awt.Color;
import java.util.ArrayList;

import carte.Cellule;
import carte.terrain.Forest;
import carte.terrain.Land;
import carte.terrain.Volcano;

public class Lava extends Fluid {

	private static final String typeName = "Lava";
	//durcissement de la lave
	public static final float HARDENING_RATE = 0.1f;
	//probabilite qu'une foret prenne feu a cote de la lave
	public static final float INFLAME_RATE = 0.7f;
	
	public Lava(){
		super(new Color(186,15,43), 0, typeName, false);
	}
	
	public Lava(int quantity){
		super(new Color(186,15,43), quantity, typeName, false);
	}
	
	public static String getTypeName(){
		return typeName;
	}
	
	public void evolve(ArrayList<Cellule> oldEnv, ArrayList<Cellule> newEnv) {
		//il faut verifier que nous ne sommes pas sur un volcan
		if(!(oldEnv.get(0).getLand() instanceof Volcano)){
			//il y a de la chance pour qu'une unite de lave refroidisse et devienne de la pierre
			//mais il y a encore plus de chance s'il y a de l'eau a cote
			float hardeningCurrentRate = HARDENING_RATE;
			for(Cellule cell : oldEnv){
				if(cell.containFluid()){
					if(cell.getFluid() instanceof Water){
						hardeningCurrentRate += HARDENING_RATE;
					}
				}
				//si c'est une foret elle a une probabilite de prendre feu
				else if(cell.getLand() instanceof Forest){
					if(rand.nextFloat() < INFLAME_RATE){
						cell.addFire();
					}
				}
			}
			if(rand.nextFloat() < hardeningCurrentRate){
				newEnv.get(0).setLand(Land.Mountain());
				newEnv.get(0).removeFluid(1);
				//on augmente aussi l'altitude de la case
				newEnv.get(0).setAltitude(newEnv.get(0).getAltitude()+1);
			}
		}
		//if faut verifier qu'il y a bien de la lave
		super.evolve(oldEnv, newEnv);
	}
	
	//on peut cloner le Lava
	public Object clone() {
	    Lava Lava = null;
	    // On récupère l'instance à renvoyer par l'appel de la 
		// méthode super.clone()
		Lava = (Lava) super.clone();
	    // on renvoie le clone
	    return Lava;
	}
}
